<?

Class Minify {

	private $md5_config_file = '/cache/minify/md5.inc.php';
	private $md5_changed = false;
	private $md5 = array();
	private $cache_dir = 'cache/minify/';
	private $document_root;
	private $error_reporting = 'E_ALL';
	private $cache_expire;
	private $minify_on = true;
	private $expire_on = true;
	private $cache_on = true;
	private $headers;

	function __construct() {
		error_reporting($this->error_reporting);
		$this->document_root = CONFIG_DOCUMENT_ROOT;
		$this->md5 = unserialize(file_get_contents($this->document_root.$this->md5_config_file));

		// Tiempo de validez del cache en segundos (para el encabezado Expires)
		$this->cache_expire = 3600 * 24 * 365 * 10;

		$this->headers = array(
			'js' 	=> array("Content-type: application/javascript"),
			'css' => array("Content-type: text/css")
		);
	}
	
	function minify ($type="js", $arr=false) {
		if (!$arr || !is_array($arr)) return;
		$return = '';

		// TODO: Cachear la combinacion de todos los scripts y devolver eso si existe

		foreach ($arr as $script) {
			// Obtengo el contenido del script
			if ($script_content = file_get_contents($this->document_root.$script)) {
				// Obtengo el md5 del script original
				$md5 = md5($script_content);

				//Nombre del cache de este script
				$cache_file = str_replace('//', '/', $this->document_root.$this->cache_dir.end(explode('/', $script)).(($this->minify_on)? '-m' : '-f').'-v='.$md5);
//echo '/*'.$cache_file.'*/';
				// Si los md5 son iguales y existe el cache, devuelvo eso
				if (isset($this->md5[$script]) && ($this->md5[$script] == $md5) && ($this->cache_on) && ($cache = file_get_contents($cache_file))) {
//echo '/*FROM CACHE*/';
					$return .= $cache;
				} else {
//echo '/*MINIMIZED*/'."\n";
					$this->md5[$script] = $md5;
					$this->md5_changed = true;
					$obj = ($type == 'css')? 'cssmin' : 'JSMin';
//					$mini = ($this->minify_on)? $obj::minify($script_content) : $script_content;
					$mini = ($this->minify_on)? call_user_func(array($obj, 'minify'), $script_content) : $script_content;
					file_put_contents($cache_file, $mini);
					$return .= $mini;
				}
			}
		}
		
		// Actualizo el archivo de md5s
		$this->update_md5();

		// Envio los encabezados
		$this->sendHeaders($this->headers[$type]);
			
		echo $return;
	}	
	
	function sendHeaders($hdrs=false) {

		// Encabezados custom (si me pasaron alguno)
		if ($hdrs && is_array($hdrs))
			foreach ($hdrs as $h)
				header($h);

		// Encabezados para todos (gratis! yo invito) 

		// Envio los encabezados de Cache Expires
		if ($this->expire_on) {
			header("Pragma: public");
			header("Expires: " . gmdate("D, d M Y H:i:s", time() + $this->cache_expire) . " GMT");
			header("Cache-Control: max-age=".$this->cache_expire);
		}
	}

	function update_md5() {
		if ($this->md5_changed)
			file_put_contents($this->document_root.$this->md5_config_file, serialize($this->md5));
		$this->md5_changed = false;
	}
	
}

?>
